export default class Evt {
	constructor(cfg){
		this.__ID = ""
		this.__listeners = new Map() 
		this.__once_listeners = new Map() 
	}	
	ID(){
		return Math.random().toFixed(6).toString().replace(/\./,"")
	}		
	on(en,cb){
		if(!this.__listeners.has(en))
			this.__listeners.set(en,[])

		this.__listeners.get(en).push(cb)
		return this
	}
	once(en,cb){
		if(!this.__once_listeners.has(en))
			this.__once_listeners.set(en,[])

		this.__once_listeners.get(en).push(cb)
		return this
	}
	off(en){
		this.__listeners.has(en)&&this.__listeners.delete(en)
	}
	emit(en,...data){
		this._emit(en,this.__listeners,false,...data)
		this._emit(en,this.__once_listeners,true,...data)
		this._emit("anyway",this.__once_listeners,true)
	}
	_emit(en,lis,once){
		if(lis.has(en))
		lis.get(en).forEach((cb) =>{
			cb(...[...arguments].slice(3))
		})
		if(once)
			lis.delete(en)

	}
	emitAsync(...arg){
		setTimeout(()=>{
			this.emit(...arg)
		})
	}
	destroy(){
		this.__listeners=[]
		this.__once_listeners=[]
	}
}
